package com.jsh.erp.controller;

import com.jsh.erp.datasource.entities.User;
import com.jsh.erp.service.CommonUserService;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDate;

@RestController
@RequestMapping("/ai")
public class AIController {

    @Lazy
    @Resource(name = "qwenChatClient")
    private ChatClient chatClient;

    @Resource
    private CommonUserService commonUserService;

    @PostMapping(value = "/mcp-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> streamRagAnswerWithMCP(
            @RequestBody String question
    ) throws Exception {
        User commonUser = commonUserService.getCurrentUser();
        Long commonUserId = commonUser.getId();
        Long tenantId = commonUser.getTenantId();
        String timeWindow = LocalDate.now().toString();

        String systemPrompt = """
                你是一个企业级erp系统的管家，你的回答必须是让非专业人士能看懂的口语化表达。
                非业务相关问题，你可以自己发挥。
                当前租户信息: tenantId=%s
                业务相关问题，请结合上下文进行回答，严禁虚构业务数据！！！
                必要时，请使用工具获取信息进行回答，并且完全参照工具获取的信息，如果工具使用异常则如实告知，禁止虚构信息。
                请用 Markdown 格式回复。
                当前时间是：%s
                """.formatted(
                tenantId,
                new java.util.Date(System.currentTimeMillis()).toString()
        );
        return chatClient.prompt()
                .system(systemPrompt)
                .user(question)
                //使用userId+tenantId+年月日作为对话记忆id
                .advisors(a -> a.param(ChatMemory.CONVERSATION_ID,commonUserId+"_"+tenantId+"_"+timeWindow))
                .stream()
                .content()
//                .doOnSubscribe(subscription ->
//                        System.out.println("开始MCP调用"))
//                .doOnNext(content ->
//                        System.out.println("收到响应: " + content))
//                .doOnComplete(() ->
//                        System.out.println("MCP调用完成"))
//                .doOnError(error -> {
//                    System.err.println("MCP调用失败: " + error.getClass().getSimpleName());
//                    System.err.println("错误信息: " + error.getMessage());
//                })
                ;
    }
}